package com.example.untitled.printactivity

import android.content.Context
import com.example.untitled.model.DishInfoModel
import com.gprinter.command.EscCommand
import com.gprinter.command.LabelCommand
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.view.View
import com.gprinter.command.CpclCommand
import android.widget.TableLayout
import android.widget.TableRow
import android.widget.TextView
import com.example.untitled.printactivity.PrintContent
import com.jingsong.gp_print_util.R
import com.jingsong.gp_print_util.printactivity.App
import java.util.*

/**
 * Created by Administrator on 2018/4/16.
 */
object PrintContent {
    /**
     * 票据打印测试页
     *
     * @return
     */
    @JvmStatic
    fun getReceipt(model: DishInfoModel): Vector<Byte> {
        val esc = EscCommand()
        //初始化打印机
        esc.addInitializePrinter()
        //打印走纸多少个单位
        esc.addPrintAndFeedLines(1.toByte())
        // 设置打印居中
        esc.addSelectJustification(EscCommand.JUSTIFICATION.CENTER)
        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        // 打印文字
        esc.addText("${model.resName}\n")
        //打印并换行
        esc.addPrintAndLineFeed()
        // 取消倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF
        )
        // 设置打印左对齐
        esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT)
        // 打印文字
        esc.addText("下单时间：${model.time}\n")
        esc.addText("订单编号：${model.orderId}\n")
        esc.addText("手机号:\n")
        esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT)
        //        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        esc.addText("${model.phone}\n")
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF
        )
        esc.addText("下单人：\n")
        esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT)
        //        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        esc.addText("${model.name}\n")
        esc.addPrintAndLineFeed()
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF
        )
        // 打印文字
        esc.addText("********************************\n")
        esc.addText("取餐号：\n")
        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        esc.addText("${model.id}\n")
        esc.addPrintAndLineFeed()
        // 打印文字
        esc.addText("${model.dishName}\n")

        // 设置打印居中
//        esc.addSelectJustification(EscCommand.JUSTIFICATION.CENTER);
        // 设置为倍高倍宽
//        esc.addSelectPrintModes(EscCommand.FONT.FONTA, EscCommand.ENABLE.OFF, EscCommand.ENABLE.ON, EscCommand.ENABLE.ON, EscCommand.ENABLE.OFF);
        // 打印文字
        esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT)

        // 取消倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF
        )
        // 设置打印左对齐
//        esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT);

//            // 设置打印左对齐
//            esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT);
//            esc.addText("居左");
//            esc.addPrintAndLineFeed();
//            // 设置打印居中对齐
//            esc.addSelectJustification(EscCommand.JUSTIFICATION.CENTER);
//            esc.addText("居中");
//            esc.addPrintAndLineFeed();
//            // 设置打印居右对齐
//            esc.addSelectJustification(EscCommand.JUSTIFICATION.RIGHT);
//            esc.addText("居右");
//            esc.addPrintAndLineFeed();
//            esc.addPrintAndLineFeed();
//            // 设置打印左对齐
//            esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT);
//            esc.addText("打印Bitmap图测试:\n");
//            Bitmap b = BitmapFactory.decodeResource(App.getContext().getResources(), R.drawable.gprinter);
        // 打印图片  光栅位图  384代表打印图片像素  0代表打印模式
        // 58mm打印机 可打印区域最大点数为 384 ，80mm 打印机 可打印区域最大点数为 576
//            esc.addRastBitImage(b, 384, 0);
        esc.addPrintAndLineFeed()
        esc.addText("********************************\n")
        //        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTB,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        //            // 打印文字
        esc.addText("总价:${model.amount}元\n")
        esc.addPrintAndLineFeed()
        // 取消倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.OFF
        )
        //        esc.addText("********************************\n");
        esc.addText("备注：${model.remark}\n")
        //            esc.addSelectPrintingPositionForHRICharacters(EscCommand.HRI_POSITION.BELOW);
//            // 设置条码可识别字符位置在条码下方
//            // 设置条码高度为60点
//            esc.addSetBarcodeHeight((byte) 60);
//            // 设置条码宽窄比为2
//            esc.addSetBarcodeWidth((byte) 2);
//            // 打印Code128码
//            esc.addCODE128(esc.genCodeB("barcode128"));
//            esc.addPrintAndLineFeed();
//        /*
//        * QRCode命令打印 此命令只在支持QRCode命令打印的机型才能使用。 在不支持二维码指令打印的机型上，则需要发送二维条码图片
//		*/
//            esc.addText("打印二维码测试:\n");
//            // 设置纠错等级
//            esc.addSelectErrorCorrectionLevelForQRCode((byte) 0x31);
//            // 设置qrcode模块大小
//            esc.addSelectSizeOfModuleForQRCode((byte) 4);
//            // 设置qrcode内容
//            esc.addStoreQRCodeData("www.smarnet.cc");
//            // 打印QRCode
//            esc.addPrintQRCode();
        //打印并走纸换行
        esc.addPrintAndLineFeed()
        // 设置打印居中对齐
        esc.addSelectJustification(EscCommand.JUSTIFICATION.CENTER)
        //打印fontB文字字体
//        esc.addSelectCharacterFont(EscCommand.FONT.FONTB);
        // 设置为倍高倍宽
        esc.addSelectPrintModes(
            EscCommand.FONT.FONTA,
            EscCommand.ENABLE.OFF,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.ON,
            EscCommand.ENABLE.OFF
        )
        esc.addText("感谢您的惠顾!\r\n")
        //打印并换行
        esc.addPrintAndLineFeed()
        //打印走纸n个单位
        esc.addPrintAndFeedLines(4.toByte())
        // 开钱箱
        esc.addGeneratePlus(LabelCommand.FOOT.F2, 255.toByte(), 255.toByte())
        //开启切刀
        esc.addCutPaper()
        //添加缓冲区打印完成查询
        val bytes = byteArrayOf(0x1D, 0x72, 0x01)
        //添加用户指令
        esc.addUserCommand(bytes)
        return esc.command
    }// 设置标签尺寸宽高，按照实际尺寸设置 单位mm
    // 设置标签间隙，按照实际尺寸设置，如果为无间隙纸则设置为0 单位mm
    // 设置打印方向
    // 开启带Response的打印，用于连续打印
    // 设置原点坐标
    //设置浓度
    // 撕纸模式开启
    // 清除打印缓冲区
    // 绘制简体中文
    //打印繁体
    //打印韩文
    // 绘制图片
    //绘制二维码
    // 绘制一维条码
    // 打印标签
    // 打印标签后 蜂鸣器响
    //开启钱箱
    // 发送数据
    /**
     * 标签打印测试页
     *
     * @return
     */
    @JvmStatic
    val label: Vector<Byte>
        get() {
            val tsc = LabelCommand()
            // 设置标签尺寸宽高，按照实际尺寸设置 单位mm
            tsc.addSize(60, 75)
            // 设置标签间隙，按照实际尺寸设置，如果为无间隙纸则设置为0 单位mm
            tsc.addGap(0)
            // 设置打印方向
            tsc.addDirection(LabelCommand.DIRECTION.FORWARD, LabelCommand.MIRROR.NORMAL)
            // 开启带Response的打印，用于连续打印
            tsc.addQueryPrinterStatus(LabelCommand.RESPONSE_MODE.ON)
            // 设置原点坐标
            tsc.addReference(0, 0)
            //设置浓度
            tsc.addDensity(LabelCommand.DENSITY.DNESITY4)
            // 撕纸模式开启
            tsc.addTear(EscCommand.ENABLE.ON)
            // 清除打印缓冲区
            tsc.addCls()
            // 绘制简体中文
            tsc.addText(
                10,
                0,
                LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE,
                LabelCommand.ROTATION.ROTATION_0,
                LabelCommand.FONTMUL.MUL_1,
                LabelCommand.FONTMUL.MUL_1,
                "欢迎使用Printer"
            )
            //打印繁体
            tsc.addUnicodeText(
                10,
                32,
                LabelCommand.FONTTYPE.TRADITIONAL_CHINESE,
                LabelCommand.ROTATION.ROTATION_0,
                LabelCommand.FONTMUL.MUL_1,
                LabelCommand.FONTMUL.MUL_1,
                "BIG5碼繁體中文字元",
                "BIG5"
            )
            //打印韩文
            tsc.addUnicodeText(
                10,
                60,
                LabelCommand.FONTTYPE.KOREAN,
                LabelCommand.ROTATION.ROTATION_0,
                LabelCommand.FONTMUL.MUL_1,
                LabelCommand.FONTMUL.MUL_1,
                "Korean 지아보 하성",
                "EUC_KR"
            )
            val b = BitmapFactory.decodeResource(
                App.getContext().resources,
                R.drawable.gprinter
            )
            // 绘制图片
            tsc.addBitmap(10, 80, LabelCommand.BITMAP_MODE.OVERWRITE, 300, b)
            //绘制二维码
            tsc.addQRCode(
                10,
                380,
                LabelCommand.EEC.LEVEL_L,
                5,
                LabelCommand.ROTATION.ROTATION_0,
                " www.smarnet.cc"
            )
            // 绘制一维条码
            tsc.add1DBarcode(
                10,
                500,
                LabelCommand.BARCODETYPE.CODE128,
                100,
                LabelCommand.READABEL.EANBEL,
                LabelCommand.ROTATION.ROTATION_0,
                "SMARNET"
            )
            // 打印标签
            tsc.addPrint(1, 1)
            // 打印标签后 蜂鸣器响
            tsc.addSound(2, 100)
            //开启钱箱
            tsc.addCashdrwer(LabelCommand.FOOT.F5, 255, 255)
            // 发送数据
            return tsc.command
        }

    /**
     * 标签打印长图
     *
     * @param bitmap
     * @return
     */
    @JvmStatic
    fun printViewPhoto(bitmap: Bitmap?): Vector<Byte> {
        val labelCommand = LabelCommand()
        /**
         * 参数说明
         * 0：打印图片x轴
         * 0：打印图片Y轴
         * 576：打印图片宽度  纸张可打印宽度  72 *8
         * bitmap:图片
         */
        labelCommand.addZLibNoTrembleBitmapheight(0, 0, 576, bitmap)
        return labelCommand.command
    }

    /**
     * 面单打印测试页
     *
     * @return
     */
    @JvmStatic
    val cPCL: Vector<Byte>
        get() {
            val cpcl = CpclCommand()
            cpcl.addInitializePrinter(1130, 1)
            cpcl.addJustification(CpclCommand.ALIGNMENT.CENTER)
            cpcl.addSetmag(1, 1)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 30, "Sample")
            cpcl.addSetmag(0, 0)
            cpcl.addJustification(CpclCommand.ALIGNMENT.LEFT)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 65, "Print text")
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 95, "Welcom to use SMARNET printer!")
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_13, 0, 135, "佳博智匯標籤打印機")
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 195, "智汇")
            cpcl.addJustification(CpclCommand.ALIGNMENT.CENTER)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 195, "网络")
            cpcl.addJustification(CpclCommand.ALIGNMENT.RIGHT)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 195, "设备")
            cpcl.addJustification(CpclCommand.ALIGNMENT.LEFT)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 230, "Print bitmap!")
            val bitmap = BitmapFactory.decodeResource(
                App.getContext().resources,
                R.drawable.gprinter
            )
            cpcl.addEGraphics(0, 255, 385, bitmap)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 645, "Print code128!")
            cpcl.addBarcodeText(5, 2)
            cpcl.addBarcode(
                CpclCommand.COMMAND.BARCODE,
                CpclCommand.CPCLBARCODETYPE.CODE128,
                50,
                0,
                680,
                "SMARNET"
            )
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 775, "Print QRcode")
            cpcl.addBQrcode(0, 810, "QRcode")
            cpcl.addJustification(CpclCommand.ALIGNMENT.CENTER)
            cpcl.addText(CpclCommand.TEXT_FONT.FONT_4, 0, 1010, "Completed")
            cpcl.addJustification(CpclCommand.ALIGNMENT.LEFT)
            cpcl.addPrint()
            return cpcl.command
        }

    /**
     * 获取图片
     *
     * @param mcontext
     * @return
     */
    @JvmStatic
    fun getBitmap(mcontext: Context?): Bitmap {
        val v =
            View.inflate(App.getContext(), R.layout.pj, null)
        val tableLayout =
            v.findViewById<View>(R.id.li) as TableLayout
        val jine =
            v.findViewById<View>(R.id.jine) as TextView
        val pep =
            v.findViewById<View>(R.id.pep) as TextView
        tableLayout.addView(ctv(mcontext, "红茶\n加热\n加糖", 8, 3))
        tableLayout.addView(ctv(mcontext, "绿茶", 109, 899))
        tableLayout.addView(ctv(mcontext, "咖啡", 15, 4))
        tableLayout.addView(ctv(mcontext, "红茶", 8, 3))
        tableLayout.addView(ctv(mcontext, "绿茶", 10, 8))
        tableLayout.addView(ctv(mcontext, "咖啡", 15, 4))
        tableLayout.addView(ctv(mcontext, "红茶", 8, 3))
        tableLayout.addView(ctv(mcontext, "绿茶", 10, 8))
        tableLayout.addView(ctv(mcontext, "咖啡", 15, 4))
        tableLayout.addView(ctv(mcontext, "红茶", 8, 3))
        tableLayout.addView(ctv(mcontext, "绿茶", 10, 8))
        tableLayout.addView(ctv(mcontext, "咖啡", 15, 4))
        tableLayout.addView(ctv(mcontext, "红茶", 8, 3))
        tableLayout.addView(ctv(mcontext, "绿茶", 10, 8))
        tableLayout.addView(ctv(mcontext, "咖啡", 15, 4))
        jine.text = "998"
        pep.text = "张三"
        return convertViewToBitmap(v)
    }

    /**
     * mxl转bitmap图片
     *
     * @param view
     * @return
     */
    fun convertViewToBitmap(view: View): Bitmap {
        view.measure(
            View.MeasureSpec.makeMeasureSpec(
                0,
                View.MeasureSpec.UNSPECIFIED
            ),
            View.MeasureSpec.makeMeasureSpec(
                0,
                View.MeasureSpec.UNSPECIFIED
            )
        )
        view.layout(0, 0, view.measuredWidth, view.measuredHeight)
        view.buildDrawingCache()
        return view.drawingCache
    }

    fun ctv(context: Context?, name: String?, k: Int, n: Int): TableRow {
        val tb = TableRow(context)
        tb.layoutParams = TableLayout.LayoutParams(
            TableLayout.LayoutParams.WRAP_CONTENT,
            TableLayout.LayoutParams.WRAP_CONTENT
        )
        val tv1 = TextView(context)
        tv1.layoutParams = TableRow.LayoutParams(
            TableRow.LayoutParams.WRAP_CONTENT,
            TableRow.LayoutParams.WRAP_CONTENT
        )
        tv1.text = name
        tv1.setTextColor(Color.BLACK)
        tv1.textSize = 30f
        tb.addView(tv1)
        val tv2 = TextView(context)
        tv2.layoutParams = TableRow.LayoutParams(
            TableRow.LayoutParams.WRAP_CONTENT,
            TableRow.LayoutParams.WRAP_CONTENT
        )
        tv2.text = k.toString() + ""
        tv2.setTextColor(Color.BLACK)
        tv2.textSize = 30f
        tb.addView(tv2)
        val tv3 = TextView(context)
        tv3.layoutParams = TableRow.LayoutParams(
            TableRow.LayoutParams.WRAP_CONTENT,
            TableRow.LayoutParams.WRAP_CONTENT
        )
        tv3.text = n.toString() + ""
        tv3.setTextColor(Color.BLACK)
        tv3.textSize = 30f
        tb.addView(tv3)
        return tb
    }// 设置标签尺寸，按照实际尺寸设置
    // 设置标签间隙，按照实际尺寸设置，如果为无间隙纸则设置为0
    // 设置打印方向
    // 设置原点坐标
    // 撕纸模式开启
    // 清除打印缓冲区
    //添加矩阵打印二维码  旋转
    /**
     * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  ROTATION：旋转   content：内容
     */
    /**
     * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  content：内容
     */
    /**
     * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  Xzoom：放大倍数   content：内容
     */
    /**
     * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  c：ASCLL码  Xzomm：放大倍数 content：内容
     */
    // 打印标签后 蜂鸣器响
    // 发送数据
    /**
     * 打印矩阵二维码
     *
     * @return
     */
    @JvmStatic
    val newCommandToPrintQrcode: Vector<Byte>
        get() {
            val tsc = LabelCommand()
            // 设置标签尺寸，按照实际尺寸设置
            tsc.addSize(80, 80)
            // 设置标签间隙，按照实际尺寸设置，如果为无间隙纸则设置为0
            tsc.addGap(0)
            // 设置打印方向
            tsc.addDirection(LabelCommand.DIRECTION.FORWARD, LabelCommand.MIRROR.NORMAL)
            // 设置原点坐标
            tsc.addReference(0, 0)
            // 撕纸模式开启
            tsc.addTear(EscCommand.ENABLE.ON)
            // 清除打印缓冲区
            tsc.addCls()
            //添加矩阵打印二维码  旋转
            /**
             * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  ROTATION：旋转   content：内容
             */
            tsc.addDMATRIX(
                10,
                10,
                400,
                400,
                LabelCommand.ROTATION.ROTATION_90,
                "DMATRIX EXAMPLE 1"
            )
            /**
             * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  content：内容
             */
            tsc.addDMATRIX(110, 10, 200, 200, "DMATRIX EXAMPLE 1")
            /**
             * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  Xzoom：放大倍数   content：内容
             */
            tsc.addDMATRIX(210, 10, 400, 400, 6, "DMATRIX EXAMPLE 2")
            /**
             * 参数 说明  x横坐标打印起始点   y 纵坐标打印起始点   width  打印宽度 height 打印高度  c：ASCLL码  Xzomm：放大倍数 content：内容
             */
            tsc.addDMATRIX(
                10,
                200,
                100,
                100,
                126,
                6,
                "~1010465011125193621Gsz9YC24xBbQD~12406404~191ffd0~192Ypg+oU9uLHdR9J5ms0UlqzSPEW7wYQbknUrwOehbz+s+a+Nfxk8JlwVhgItknQEZyfG4Al26Rs/Ncj60ubNCWg=="
            )
            tsc.addPrint(1, 1)
            // 打印标签后 蜂鸣器响
            tsc.addSound(2, 100)
            // 发送数据
            return tsc.command
        }
}